"""

    并发运行任务

"""
import asyncio

from async_web import async_timed


async def delay(seconds):
    print(f"sleep for {seconds} seconds")
    await asyncio.sleep(seconds)


# @async_timed()
# async def main():
#     delay_times = [3, 3, 3]
#     # 这种写法，会造成同步执行
#     # 原因：每次列表推导的时候，使用await，这将会暂停列表推导，直到delay任务完成，才会继续执行列表推导
#     [await asyncio.create_task(delay(seconds)) for seconds in delay_times]

# 可以改成下面的写法
@async_timed()
async def main():
    delay_times = [3, 3, 3]
    tasks = [asyncio.create_task(delay(seconds)) for seconds in delay_times]
    [await task for task in tasks]


# 但是这种写法也有弊端：
# 1、代码由多行组成
# 2、不灵活，如果一个协程比另一个协程早完成，则陷入第二个推导式中，等待所有其他协程完成，结果出来却无法立即处理返回
# 3、异常处理（最大），如果其中一个协程出现异常，异常会导致停止，这样，其他已经完成的协程，它们的结果无法返回。
# 因此使用asyncio.gather(*tasks)解决
asyncio.run(main())
